/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  v2006                                 |
|   \\  /    A nd           | Website:  www.openfoam.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

geometry
{
    cylinder
    {
        type   cylinder;
        point1 (0 -4 0);
        point2 (0 4 0);
        radius 0.7;
    }
    cylinder2
    {
        type    extrudedCircle;
        file    "curve2.vtk";
        radius  0.5;
    }
    inletPlane
    {
        type    plate;
        origin  (-4 -50 -50);
        span    (0 100 100);
    }
}

vertices
(
    // Vertical cylinder
    name v0 project (-1 -0.1 -1) (cylinder cylinder2)
    name v1 project ( 1 -0.1 -1) (cylinder)
    name v2 project ( 1  0.9 -1) (cylinder)
    name v3 project (-1  0.9 -1) (cylinder cylinder2)
    name v4 project (-1 -0.1  1) (cylinder cylinder2)
    name v5 project ( 1 -0.1  1) (cylinder)
    name v6 project ( 1  0.9  1) (cylinder)
    name v7 project (-1  0.9  1) (cylinder cylinder2)


    // Horizontal cylinder
    name v8  project (-4  0 -0.5) (cylinder2 inletPlane)
    name v9  project (-4  1 -0.5) (cylinder2 inletPlane)
    name v10 project (-4  0  0.5) (cylinder2 inletPlane)
    name v11 project (-4  1  0.5) (cylinder2 inletPlane)


    // On top of vertical cylinder
    name v12 project (-1 2 -1) (cylinder)
    name v13 project ( 1 2 -1) (cylinder)
    name v14 project ( 1 2  1) (cylinder)
    name v15 project (-1 2  1) (cylinder)

    // Below vertical cylinder
    name v16 project (-1 -1 -1) (cylinder)
    name v17 project ( 1 -1 -1) (cylinder)
    name v18 project ( 1 -1  1) (cylinder)
    name v19 project (-1 -1  1) (cylinder)
);

blocks
(
    hex (v0 v1 v2 v3 v4 v5 v6 v7) (8 8 8) simpleGrading (1 1 1)
    name sideBlock hex (v0 v3 v9 v8 v4 v7 v11 v10) (8 20 8)
        simpleGrading (1 1 1)

    hex ( v7 v6 v2 v3 v15 v14 v13 v12) (8 8 8) simpleGrading (1 1 1)
    hex (v16 v19 v18 v17 v0 v4 v5 v1) (8 8 8) simpleGrading (1 1 1)
);

edges
(
    project v0 v1 (cylinder)
    project v1 v2 (cylinder)
    project v2 v3 (cylinder)

    project v1 v5 (cylinder)
    project v2 v6 (cylinder)

    project v4 v5 (cylinder)
    project v5 v6 (cylinder)
    project v6 v7 (cylinder)

    // Common face
    project v3 v0 (cylinder cylinder2)
    project v3 v7 (cylinder cylinder2)
    project v7 v4 (cylinder cylinder2)
    project v0 v4 (cylinder cylinder2)

    // Inlet
    project v8 v10 (cylinder2 inletPlane)
    project v10 v11 (cylinder2 inletPlane)
    project v11 v9 (cylinder2 inletPlane)
    project v9 v8 (cylinder2 inletPlane)

    // Sides of horizontal cylinder. Use projectCurve to do interpolation
    // for radial direction to keep points along edges at constant radial
    // direction.
    projectCurve v8  v0 (cylinder2)
    projectCurve v9  v3 (cylinder2)
    projectCurve v11 v7 (cylinder2)
    projectCurve v10 v4 (cylinder2)



    // Top cylinder
    project v12 v15 (cylinder)
    project v15 v14 (cylinder)
    project v14 v13 (cylinder)
    project v13 v12 (cylinder)

    // Bottom cylinder
    project v16 v17 (cylinder)
    project v17 v18 (cylinder)
    project v18 v19 (cylinder)
    project v19 v16 (cylinder)
);

faces
(
    // Common face
    project (v0 v4 v7 v3) cylinder

    project (v4 v5 v6 v7) cylinder
    project (v0 v1 v2 v3) cylinder

    project (v8 v0 v4 v10) cylinder2
    project (v10 v4 v7 v11) cylinder2
    project (v11 v7 v3 v9) cylinder2
    project (v8 v9 v3 v0) cylinder2
);


defaultPatch
{
    name walls;
    type wall;
}

boundary
(
    side
    {
        type    patch;
        faces   ((sideBlock 3));   //((v8 v10 v11 v9));
    }

    inlet
    {
        type    patch;
        faces   ((v17 v18 v19 v16));
    }

    outlet
    {
        type    patch;
        faces   ((v12 v15 v14 v13));
    }
);

// ************************************************************************* //
